unit UINTEG;
interface

{ Процедурний тип }
TYPE	TFun = Function ( x: real; t:integer): real;
	Type Tfunr=function(x:real):real;
{ Заголовки функцій }
   Function Mtrap(a, b, e: real; t:integer; F: TFun): real;
   Function Msimp(a, b, e: real; t:integer; F: TFun):real;
   Function Mpodil(a,b,e:real; f:Tfunr):real;
   Function Mpryamokut(a, b, e: real; t:integer; F: TFun):real;
   Function tg(x:real):real;
   Function stup(x:real; t:integer):real;

implementation

{ Метод трапецій }
Function Mtrap(a, b, e: real; t:integer; F: TFun): real;
Const	n=10;
Var	x, h, d, s2, s2n: real;
	i, m: integer;
begin
    m:=n;
    s2:=0;
    repeat
     h:=(b-a)/m;
     s2n:=(F(a, t)+F(b, t))/2;
     for i:=1 to m-1 do
        begin
         x:=a+i*h;
         s2n:= s2n+F(x, t);
        end;
      s2n:= s2n*h;
      if m=n then d:=e+1 else d:=abs(s2n-s2);
      s2:=s2n;  m:=m*2;
     until d<e;
     result:=s2n;
end;

{ Метод Сімпсона }
 Function Msimp(a, b, e: real; t:integer; F: TFun): real;
Const	n=10;
Var	x, h, d, s2, s2n,R1,R2: real;
	i, m: integer;
begin
    m:=n;
    s2:=0;
    repeat
     h:=(b-a)/(2*m);
     R1:=0; R2:=0;
     s2n:=(F(a, t)+F(b, t));
     for i:=1 to m do
        begin
         x:=a+(2*i-1)*h;
         R1:= R1+F(x, t);
        end;
       for i:=1 to m-1 do
        begin
         x:=a+2*i*h;
          R2:= R2+F(x, t);
        end;
      s2n:= (s2n+4*R1+2*R2)*h/3;
      if m=n then d:=e+1 else d:=abs(s2n-s2);
      s2:=s2n;  m:=m*2;
     until d<e;
     result:=s2n;
end;
{ Метод поділу відрізка навпіл }
function Mpodil(a,b,e:real; f:Tfunr):real;
 var x:real;
 begin
 x:=(a+b)/2;
 while abs(b-a)>e do
 begin
 x:=(a+b)/2;
 if f(x)=0 then break;
 if f(a)*f(x)<=0 then b:=x;
  if f(a)*f(x)>0 then a:=x;
 end;
  result:=x;
 end;

 { Метод прямокутників }
Function Mpryamokut(a, b, e: real; t:integer; F: TFun): real;
Const	n=10;
Var	x, h, d, s2, s2n: real;
	i, m: integer;
begin
    m:=n;
    s2:=0;
    repeat
     h:=(b-a)/m;
     s2n:=0;
     for i:=1 to m do
        begin
         x:=a+(2*i-1)*h/2;
         s2n:= s2n+F(x, t);
        end;
      s2n:= s2n*h;
      if m=n then d:=e+1 else d:=abs(s2n-s2);
         s2:=s2n;  m:=m*2;
     until d<e;
     result:=s2n;
end;

{Розраховує тангенс в радианах}
Function tg(x:real):real;
begin
      Result:= sin(x)/cos(x);
end;

{Вмраховує x^t (x t-ої степені)}
Function stup(x:real; t:integer):real;
var i:integer;
begin
 Result:=1;
 for i:=1 to t do
     Result:=Result*x;
end;

end.
